package com.ccp.dev.workflow.model;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.ccp.dev.core.basic.model.BaseModel;
import com.ccp.dev.core.util.StringUtil;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 对象功能:系统条件脚本 Model对象
 * 开发人员:fanruiqi
 * 创建时间:2019-7-18
 */
@XmlRootElement(name="personScript")
@XmlAccessorType(XmlAccessType.NONE)
public class PersonScript extends BaseModel<PersonScript>
{
	static Map<String,String> paraTypeMap=new HashMap<String, String>();
	static {
		paraTypeMap.put("int", "java.lang.Integer");
		paraTypeMap.put("short", "java.lang.Short");
		paraTypeMap.put("long", "java.lang.Long");
		paraTypeMap.put("float", "java.lang.Float");
		paraTypeMap.put("double", "java.lang.Double");
		paraTypeMap.put("char", "java.lang.Character");
		paraTypeMap.put("byte", "java.lang.Byte");
		paraTypeMap.put("boolean", "java.lang.Boolean");
		
	}

	/**
	 * 主键
	 */
	@XmlElement
	protected String  id;
	/**
	 * 脚本所在类的类名
	 */
	@XmlElement
	protected String  className;
	/**
	 * 类实例名
	 */
	@XmlElement
	protected String  classInsName;
	/**
	 * 方法名
	 */
	@XmlElement
	protected String  methodName;
	/**
	 * 方法描述
	 */
	@XmlElement
	protected String  methodDesc;
	/**
	 * 返回值类型
	 */
	@XmlElement
	protected String  returnType;
	/**
	 *  参数信息
	 * [
	 * 	{
	 * 		"paraName":"arg0",
	 * 		"paraType":"org.flowable.task.service.impl.persistence.entity.TaskEntity",
	 * 		"paraDesc":"任务实体",
	 * 		"paraCt":"18"
	 *  }
	 * ]
	 */
	@XmlElement
	protected String  argument;
	/**
	 * 是否有效
	 */
	@XmlElement
	protected int  enable;

	public void setId(String id)
	{
		this.id = id;
	}
	/**
	 * 返回 主键
	 * @return
	 */
	public String getId()
	{
		return this.id;
	}
	public void setClassName(String className) 
	{
		this.className = className;
	}
	/**
	 * 返回 脚本所在类的类名
	 * @return
	 */
	public String getClassName() 
	{
		return this.className;
	}
	public void setClassInsName(String classInsName) 
	{
		this.classInsName = classInsName;
	}
	/**
	 * 返回 类实例名
	 * @return
	 */
	public String getClassInsName() 
	{
		return this.classInsName;
	}
	public void setMethodName(String methodName) 
	{
		this.methodName = methodName;
	}
	/**
	 * 返回 方法名
	 * @return
	 */
	public String getMethodName() 
	{
		return this.methodName;
	}
	public void setMethodDesc(String methodDesc) 
	{
		this.methodDesc = methodDesc;
	}
	/**
	 * 返回 方法描述
	 * @return
	 */
	public String getMethodDesc() 
	{
		return this.methodDesc;
	}
	public void setReturnType(String returnType) 
	{
		this.returnType = returnType;
	}
	/**
	 * 返回 返回值类型
	 * @return
	 */
	public String getReturnType() 
	{
		return this.returnType;
	}
	public void setArgument(String argument) 
	{
		this.argument = argument;
	}
	/**
	 * 返回 参数信息
	 * @return
	 */
	public String getArgument() 
	{
		return this.argument;
	}
	public void setEnable(int enable)
	{
		this.enable = enable;
	}
	/**
	 * 返回 是否有效
	 * @return
	 */
	public int getEnable()
	{
		return this.enable;
	}

	
	/**
	 * 取得条件节点的参数类型
	 * @return
	 * @throws ClassNotFoundException
	 */
	public List<Class<?>> getArgumentsClass() throws ClassNotFoundException{
		List<Class<?>> argClass = new ArrayList<Class<?>>();
		if(StringUtil.isEmpty(argument)){
			return argClass;
		}
		
		JSONArray jsonArray = JSONArray.parseArray(argument);
		for(int i=0;i<jsonArray.size();i++){
			JSONObject jsonObject = jsonArray.getJSONObject(i);
			String cn = jsonObject.getString("paraType");
			if(paraTypeMap.containsKey(cn)){
				cn=paraTypeMap.get(cn);
			}
			argClass.add(Class.forName(cn));
		}
		
		return argClass;
	}

	@Override
	public String toString() {
		return "ConditionScript{" +
				"id='" + id + '\'' +
				", className='" + className + '\'' +
				", classInsName='" + classInsName + '\'' +
				", methodName='" + methodName + '\'' +
				", methodDesc='" + methodDesc + '\'' +
				", returnType='" + returnType + '\'' +
				", argument='" + argument + '\'' +
				", enable=" + enable +
				'}';
	}
}